package br.com.canvasForAll.model.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name="CANVAS")
@NamedQueries(value = {
		@NamedQuery(name = "Canvas.pesquisa", query = "SELECT c FROM Canvas c"),
		@NamedQuery(name = "Canvas.duplicata", query = "SELECT COUNT(c) FROM Canvas c WHERE c.id = :id")
})
public class Canvas implements Serializable {

	private static final long serialVersionUID = 6464334841532362350L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "ID_CANVAS", unique = true, nullable = false)
	private Long id;
	
	@Column(name="TITULO_CANVAS", nullable = false)
	private String titulo;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DATA_CRIACAO", nullable=false)
	private Date dataCriacao;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DATA_ULTIMA_ATUALIZACAO", nullable=false)
	private Date dataUltimaAtualizacao;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DATA_ULTIMA_SINCRONIZACAO", nullable = true)
	private Date dataUltimaSincronizacao;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DATA_ULTIMA_NOTIFICACAO", nullable = true)
	private Date dataUltimaNotificacao;
	
	@Column(name = "FLAG_LOCAL_CRIACAO", length = 1, columnDefinition = "CHAR")
	private String localCriacao;
	
	@Column(name = "FLAG_NOTIFICAR", length = 1, columnDefinition = "CHAR")
	private String notificar;
	
	@OneToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER, orphanRemoval = true)
	@JoinColumn(name = "ID_PERFIL", nullable = true)
	private Perfil perfilResponsavel;
	
	@ManyToMany(fetch = FetchType.EAGER)
	@JoinTable(name = "PARTICIPANTES",
			joinColumns = @JoinColumn(name = "ID_CANVAS", referencedColumnName = "ID_CANVAS"),
			inverseJoinColumns = @JoinColumn(name = "ID_PERFIL", referencedColumnName = "ID_PERFIL"))
	private List<Perfil> participantes;
	
	public Canvas(){
		this.localCriacao = "M";
		this.notificar = "S";
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public Date getDataCriacao() {
		return dataCriacao;
	}

	public void setDataCriacao(Date dataCriacao) {
		this.dataCriacao = dataCriacao;
	}

	public Date getDataUltimaAtualizacao() {
		return dataUltimaAtualizacao;
	}

	public void setDataUltimaAtualizacao(Date dataUltimaAtualizacao) {
		this.dataUltimaAtualizacao = dataUltimaAtualizacao;
	}

	public Date getDataUltimaSincronizacao() {
		return dataUltimaSincronizacao;
	}

	public void setDataUltimaSincronizacao(Date dataUltimaSincronizacao) {
		this.dataUltimaSincronizacao = dataUltimaSincronizacao;
	}

	public Date getDataUltimaNotificacao() {
		return dataUltimaNotificacao;
	}

	public void setDataUltimaNotificacao(Date dataUltimaNotificacao) {
		this.dataUltimaNotificacao = dataUltimaNotificacao;
	}

	public String getLocalCriacao() {
		return localCriacao;
	}

	public void setLocalCriacao(String localCriacao) {
		this.localCriacao = localCriacao;
	}

	public String getNotificar() {
		return notificar;
	}

	public void setNotificar(String notificar) {
		this.notificar = notificar;
	}

	public Perfil getPerfilResponsavel() {
		return perfilResponsavel;
	}

	public void setPerfilResponsavel(Perfil perfilResponsavel) {
		this.perfilResponsavel = perfilResponsavel;
	}

	public List<Perfil> getParticipantes() {
		return participantes;
	}

	public void setParticipantes(List<Perfil> participantes) {
		this.participantes = participantes;
	}
	
}
